#ifndef __GAF_GRAPHICS_H__
#define __GAF_GRAPHICS_H__

namespace GAF
{
	typedef int Anchor;
	class Graphics; //-* ForEach
}
typedef GAF::Anchor			GAF_DAnchor;
typedef GAF::Graphics			GAF_CGraphics;

#include "GAF_Define.h"

namespace GAF
{
	/// 锚点
	enum AnchorType
	{
		/// 顶部
		ANCHOR_TOP		= 0x00,
		/// 垂直居中
		ANCHOR_VCENTER		= 0x10,
		/// 底部
		ANCHOR_BUTTON		= 0x30,
		/// 垂直掩码
		ANCHOR_VMASK		= 0xF0,

		/// 左面
		ANCHOR_LEFT		= 0x00,
		/// 水平居中
		ANCHOR_HCENTER		= 0x01,
		/// 右面
		ANCHOR_RIGHT		= 0x03,
		/// 水平掩码
		ANCHOR_HMASK		= 0x0F,
	};
}
typedef GAF::AnchorType			GAF_EAnchorType;		/// 锚点
#define GAF_ANCHOR_TOP			GAF::ANCHOR_TOP			/// 顶部
#define GAF_ANCHOR_VCENTER		GAF::ANCHOR_VCENTER		/// 垂直居中
#define GAF_ANCHOR_BUTTON		GAF::ANCHOR_BUTTON		/// 底部
#define GAF_ANCHOR_VMASK		GAF::ANCHOR_VMASK		/// 垂直掩码
#define GAF_ANCHOR_LEFT			GAF::ANCHOR_LEFT		/// 左面
#define GAF_ANCHOR_HCENTER		GAF::ANCHOR_HCENTER		/// 水平居中
#define GAF_ANCHOR_RIGHT		GAF::ANCHOR_RIGHT		/// 右面
#define GAF_ANCHOR_HMASK		GAF::ANCHOR_HMASK		/// 水平掩码

namespace GAF
{
	/// 穿越屏幕
	enum ThroughType
	{
		/// 无穿越
		THROUGH_NONE,
		/// 垂直穿越
		THROUGH_VERTICAL,
		/// 水平穿越
		THROUGH_HORIZONTAL,
		/// 双向穿越
		THROUGH_BOTH
	};				
}
typedef GAF::ThroughType		GAF_EThroughType;		/// 穿越屏幕
#define GAF_THROUGH_NONE		GAF::THROUGH_NONE		/// 无穿越
#define GAF_THROUGH_VERTICAL		GAF::THROUGH_VERTICAL		/// 垂直穿越
#define GAF_THROUGH_HORIZONTAL		GAF::THROUGH_HORIZONTAL		/// 水平穿越
#define GAF_THROUGH_BOTH		GAF::THROUGH_BOTH		/// 双向穿越
					
namespace GAF
{
	/// 可绘制对象类型
	enum GraphicsType
	{
		/// 未知绘制元素
		GRAPHICS_UNKNOW,
		/// 图像元素
		GRAPHICS_IMAGE,
		/// 文字元素
		GRAPHICS_TEXT,
		/// 特效元素
		GRAPHICS_EFFECT,
		/// 模型元素
		GRAPHICS_MODEL,
		/// 界面元素
		GRAPHICS_FACE,
		/// 其他元素
		GRAPHICS_OTHER
	};
}
typedef GAF::GraphicsType		GAF_EGraphicsType;
#define GAF_GRAPHICS_UNKNOW		GAF::GRAPHICS_UNKNOW
#define GAF_GRAPHICS_IMAGE		GAF::GRAPHICS_IMAGE
#define GAF_GRAPHICS_TEXT		GAF::GRAPHICS_TEXT
#define GAF_GRAPHICS_EFFECT		GAF::GRAPHICS_EFFECT
#define GAF_GRAPHICS_MODEL		GAF::GRAPHICS_MODEL
#define GAF_GRAPHICS_FACE		GAF::GRAPHICS_FACE
#define GAF_GRAPHICS_OTHER		GAF::GRAPHICS_OTHER


#include "GAF_Bundle.h"
#include "GAF_Render.h"
#include "GAF_Action.h"
#include "GAF_ForEach.h"

/// 默认通明通道值
#define GAF_ALPHA_DEFAULT		255
/// 默认缩放值
#define GAF_ZOOM_DEFAULT		1.0f
/// 默认旋转值
#define GAF_ANGLE_DEFAULT		0.0f

namespace GAF
{
	/// 可绘制对象基类
	class _ABSTRACT Graphics : public ForEach
	{
	protected:
		/// 没有渲染
		static NotRender	m_NothingRender;

	private:
		static UINT		GetID();
		static UINT		m_nID;

	public:
		Graphics();
		virtual ~Graphics();

// 		void SetVisible_a(bool);
// 		bool GetVisible_a();

		/**
		 *  @name 属性成员
		 */
	public:
		/// 名字属性，用于布局管理
		DIM_ATTRIB_R(STD_STRING, GraphicsName);
		/// 可见属性
		DIM_ATTRIB(bool, Visible);		// 可见性
		/// 位置属性
		DIM_ATTRIB(Point, Location);		// 相对位置(非屏幕位置)
		/// 锚点属性
		DIM_ATTRIB(Anchor, Anchor);		// 锚点位置
		/// 锚点偏移属性
		DIM_ATTRIB(Point, Offset);		// 偏移量
		/// 穿屏属性
		DIM_ATTRIB(ThroughType, Through);	// 穿越屏幕
		/// 尺寸属性
		DIM_ATTRIB(Size, Size);			// 尺寸
		/// 透明度属性
		DIM_ATTRIB(BYTE, Alpha);		// 透明度(0 - 255)
		/// 旋转属性
		DIM_ATTRIB(double, Angle);		// 旋转(0 - 360)
		/// X轴缩放属性
		DIM_ATTRIB(double, ZoomX);		// X轴缩放(0 - 1)
		/// Y轴缩放属性
		DIM_ATTRIB(double, ZoomY);		// Y轴缩放(0 - 1)

		/**
		 *  @name 事件成员
		 */
		// 定义事件
	public:
		/// 渲染之前
		virtual bool		OnPreRender(GAF_CGraphics* pGraphics);	// 渲染之前
		/// 渲染时
		virtual bool		OnRender()				// 渲染时
					{return m_pRender->Render(this);}


		/**
		 *  @name 停靠功能成员
		 */
	public:
		virtual Pointer		Foreach(bool isFirst)
					{return NULL;}
		virtual UINT		GetCount()
					{return 0;}

		/// 停靠到指定的元素组中
		void			DockGroup(Graphics* pgGroup);
		/// 获得父对象组的指针
		Graphics*		GetDockGroup();

		/// 忽略尺寸
		// 此对象的父级界面中，在需要计算界面尺寸时，忽略次对象的尺寸。
		void			IgnoreSize();
		bool			IsIgnoreSize();

	protected:
		/// 父对象组指针
		Graphics*		m_pgGroup;
		/// 忽略尺寸计算
		bool			m_isIgnoreSize;


		/**
		 *  @name 关联属性
		 */
		// 关联属性
	public:
		typedef UINT		AttribType;
		enum
		{
			ATTRIB_LOCAX,
			ATTRIB_LOCAY,
			ATTRIB_ALPHA,
			ATTRIB_ANGLE,
			ATTRIB_ZOOM,
			ATTRIB_ZOOMX,
			ATTRIB_ZOOMY,
			ATTRIB_OTHER
		};

		void			Associate(AttribType atMaster, Interval& inMaster, AttribType atCharged, Interval& inCharged);
		void			ClearAssociate();

	private:
		struct AttribAssociate
		{
			AttribType	atMaster;
			Interval	inMaster;
			AttribType	atCharged;
			Interval	inCharged;
		};

		typedef STD_VECTOR<AttribAssociate>
					AttribAssociates;
		typedef STD_MAP<AttribType, AttribAssociates>
					AllAssociates;

	protected:
		AllAssociates		m_AllAssociates;

		double			AdjustAssociate(double dCharged, AttribAssociates& aas);
		inline bool		CalculateAssociate(double dMaster, double dCharged, AttribAssociate& aa, double& dReturn);

		/**
		 *  @name 属性操作
		 */
	public:
		/// 设置名字，只能设置一次
		void			SetGraphicsName(STD_STRING strGraphicsName);
		/// 设置位置
		void			SetLocation(int nX, int nY);
		/// 设置位置
		void			SetLocation(float fX, float fY, Graphics* pgFrame = NULL);
		/// 设置尺寸
		void			SetSize(UINT nWidth, UINT nHeight);
		/// 设置整体缩放
		void			SetZoom(double dZoom);
		/// 设置X轴缩放宽度
		void			SetZoomWidth(UINT nWidth);
		/// 设置Y轴缩放高度
		void			SetZoomHeight(UINT nHeight);
		/// 设置锚点
		void			SetAnchor(int nX, int nY);
		/// 设置锚点
		void			SetAnchor(float fX, float fY);
		/// 设置锚点偏移
		void			SetOffset(int nX, int nY);
		/// 设置自定义渲染类
		void			SetRender(Renderable* pRender);

		/// 获得可绘制对象类型
		/**
		 * @returns
		 *	返回类型。
		 */
		int			GetGType();
		/// 获得缩放值
		double			GetZoom();
		/// 获得最终是否可见
		bool			GetScreenVisible();
		/// 获得最终X轴坐标坐标值
		int			GetScreenPosX();
		/// 获得最终Y轴坐标坐标值
		int			GetScreenPosY();
		/// 获得最终透明值
		BYTE			GetScreenAlpha();
		/// 获得最终旋转值
		double			GetScreenAngle();
		/// 获得X轴最终缩放值
		double			GetScreenZoomX();
		/// 获得Y轴最终缩放值
		double			GetScreenZoomY();
		/// 获得最终缩放宽度
		int			GetScreenSizeW();
		/// 获得最终缩放高度
		int			GetScreenSizeH();
		/// 获得最终屏幕穿越
		ThroughType		GetScreenThrough();
		/// 附加信息
		Bundle*			AddInfos();

	protected:
		/// 可绘制对象类型
		int			m_nGType;
		/// 特殊渲染接口
		Renderable*		m_pRender;
		/// 附加信息
		Bundle			m_bdlInfo;
	};
}

#endif
